# coding:utf-8
r''' 传鸿组态_驱动
 * @ 作者: 阿拉丁矿工 黄传鸿 <hchhyzc@foxmail.com>
'''

# ==============================================================================
# 引入包
# ==============================================================================
import os
import sys
import json

# ==============================================================================
# 传鸿组态驱动类
# ==============================================================================


class HdriveClass:
    '''传鸿组态驱动类'''

    # ——————————————————————————————————————————————————————————————————————
    # 初始化
    # ——————————————————————————————————————————————————————————————————————
    def __init__(self):
        '''初始化'''

        # 通道
        self.channels: list = None
        '''通道'''

        # 设备
        self.equipData: list = None
        '''设备'''

        # 通道详情
        self.channelDetail: list = None
        '''通道详情'''

        # 服务器状态
        self.serverState = True
        '''服务器状态'''

        # 驱动扫描状态
        self.driveScanState: bool = False
        '''驱动扫描状态'''

        # 读缓存
        self.readBuffer: list = None
        '''读缓存'''

        # 写缓存
        self.writeBuffer: list = None
        '''写缓存'''

        # 发送缓存
        self.sendBuffer: list = None
        '''发送缓存'''

        # 发送缓存
        self.recordBuffer: list = None
        '''发送缓存'''

        # 记录更新
        self.recordUpda: list = False
        '''记录更新'''

    # ——————————————————————————————————————————————————————————————————————
    # 设置属性
    # ——————————————————————————————————————————————————————————————————————
    def __setattr__(self, name, value):
        '''设置属性'''
        # # print("\n♈ 设置属性")

        # 通道
        if name == 'Channels':
            self.channels = value
        # 设备
        if name == 'EquipData':
            self.equipData = value

        # 通道详情
        if name == 'ChannelDetail':
            self.channelDetail = value

        # 服务器状态
        if name == 'ServerState':
            self.serverState = value
            if self.serverState:
                pass
                # print("♈ 开启服务")
            else:
                pass
                # print("♈ 关闭服务")

        # 驱动扫描状态
        if name == 'DriveScanState':
            self.driveScanState = value
            if self.driveScanState:
                pass
                # print("♈ 开启驱动扫描")
            else:
                pass
                # print("♈ 关闭驱动扫描")

        else:

            self.__dict__[name] = value

    # ——————————————————————————————————————————————————————————————————————
    # 获取属性
    # ——————————————————————————————————————————————————————————————————————
    def __getattr__(self, name):
        '''获取属性'''
        # # print("\n♈ 获取属性")

        # 通道
        if name == 'Channels':
            return self.channels
        # 设备
        if name == 'EquipData':
            return self.equipData

        # 通道详情
        if name == 'ChannelDetail':
            return self.channelDetail

        # 服务器状态
        if name == 'ServerState':
            return self.serverState

        # 驱动扫描状态
        if name == 'DriveScanState':
            return self.driveScanState

    # ——————————————————————————————————————————————————————————————————————
    # 通过id获取设备值
    # ——————————————————————————————————————————————————————————————————————
    def getValById(self, id: str):
        '''通过id获取设备值'''
        # print("\n♈ 通过id获取设备值")
        for item in self.equipData:
            if item['equipDataId'] == id:
                return item['equipDataVal']

    # ——————————————————————————————————————————————————————————————————————
    # 通过标签获取设备值
    # ——————————————————————————————————————————————————————————————————————
    def getValByLabel(self, label: str):
        '''通过标签获取设备值'''
        # print("\n♈ 通过标签获取设备值")
        for item in self.equipData:
            if str(item['equipDataLabel']) == label:
                return item['equipDataVal']

    # ——————————————————————————————————————————————————————————————————————
    # 通过id设置设备值
    # ——————————————————————————————————————————————————————————————————————
    def setValById(self, id: str, newVal: str):
        '''通过id设置设备值'''
        # print("\n♈ 通过id设置设备值")
        for item in self.equipData:
            # print(item)
            if item['equipDataId'] == id:
                item['equipDataVal'] = newVal

    # ——————————————————————————————————————————————————————————————————————
    # 通过标签设置设备值
    # ——————————————————————————————————————————————————————————————————————
    def setValByLabel(self, label: str, newVal: str):
        '''通过标签设置设备值'''
        # print("\n♈ 通过标签设置设备值")
        for item in self.equipData:
            if item['equipDataLabel'] == label:
                item['equipDataVal'] = str(newVal)

    # ——————————————————————————————————————————————————————————————————————
    # 迭代-查询使能通道
    # ——————————————————————————————————————————————————————————————————————
    def iterationFindEnableChannel(self, info: list):
        '''迭代创建通道'''
        # # print("\n♈ 迭代创建通道")

        for item in info:
            # # print(" 迭代查找设备")
            if item['isLeaf'] and item['active']:
                self.channels.append(item)

            # 迭代
            try:
                if len(item['children']) > 0:
                    # # print("有子-迭代")
                    childrenInfo: list = item['children']
                    self.iterationFindEnableChannel(childrenInfo)
            except:
                pass

    # ——————————————————————————————————————————————————————————————————————
    # 创建通道
    # ——————————————————————————————————————————————————————————————————————
    def createChannel(self, name):
        '''创建通道'''
        # print("\n♈ 创建通道")
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 读取当前工程
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        data = ''
        FileDir = "statics/projects/" + name + '.json'
        with open(FileDir, "r",  encoding='utf-8') as f:
            data = f.read()

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 转换为字典
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        DataDict = json.loads(data)

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 筛选出通道数据
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        channelData = DataDict['channels']

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 遍历通道筛出使能设备
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        self.channels = []
        for item in channelData:
            # # print("遍历通道")
            if item['isLeaf'] and item['active']:
                self.channels.append(item)

            # 迭代
            try:
                if len(item['children']) > 0:
                    info = item['children']
                    self.iterationFindEnableChannel(info)
            except:
                pass
        # print(self.channels)
        return self.channels

    # ——————————————————————————————————————————————————————————————————————
    # 创建设备
    # ——————————————————————————————————————————————————————————————————————
    def createEquip(self, name):
        '''创建设备'''
        # print("\n♈ 创建设备")
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 读取当前工程
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        data = ''
        FileDir = "statics/projects/" + name + '.json'
        with open(FileDir, "r",  encoding='utf-8') as f:
            data = f.read()

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 转换为字典
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        DataDict = json.loads(data)

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 筛选出设备数据
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        equipData: list = DataDict['equipData']

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 遍历设备数据筛出设备
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        self.equipData = []
        for item in equipData:
            self.equipData.append({
                "equipDataId": item['equipDataId'],
                "equipDataDescr": item['equipDataDescr'],
                "equipDataLabel": item['equipDataLabel'],
                "equipDataType": item['equipDataType'],
                "equipDataRW": item['equipDataRW'],
                "channelId": item['channelId'],
                "equipDataVal": item['equipDataVal'],
            })
        return self.equipData

    # ——————————————————————————————————————————————————————————————————————
    # 创建通道详情
    # ——————————————————————————————————————————————————————————————————————
    def createChannelDetail(self):
        '''创建通道详情'''
        # print("\n♈ 创建通道详情")

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 判断数据是否满足要求
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # 通道
        if len(self.channels) == 0:
            return
        # 设备
        if len(self.equipData) == 0:
            return
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 变量转储
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # 通道详情
        self.channelDetail = []
        # 通道
        myChannels = self.channels
        # 设备
        myEquips = self.equipData

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 遍历查询
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 遍历通道
        for ch in myChannels:
            #   ★ 遍历设备
            # print("遍历通道")
            # # print(ch)
            for equip in myEquips:
                #   ★ 遍历设备
                # print("遍历设备")
                # # print(e)
                if str(ch['key']) == str(equip['channelId']):
                    self.channelDetail.append({
                        'equipDataId': equip['equipDataId'],
                        'equipDataDescr': equip['equipDataDescr'],
                        'equipDataLabel': equip['equipDataLabel'],
                        'channelId':  ch['key'],
                        'channelType':  ch['type'],
                        'channelIpAddr':  ch['ip_addr'],
                        'channelCPUSlot':  ch['cpu_slot'],
                    })

        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        #   ★ 反馈
        # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        # print(self.channelDetail)
        return self.channelDetail

# ==============================================================================
# 主函数
# ==============================================================================


def main():
    '''主函数'''
    # print("传鸿组态_驱动")


if __name__ == "__main__":
    main()
